home *** CD-ROM | disk | FTP | other *** search
/ Joystick Magazine 1996 May / cd joy 71No13.iso / pc / demos / eurosoc / source / modem / comms.c next >
Encoding:
C/C++ Source or Header  |  1996-01-18  |  19.7 KB  |  841 lines

  1. #include <time.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <bios.h>
  5. #include <stdlib.h>
  6. #include <fcntl.h>
  7.  
  8.  
  9. #include "3d.h"
  10. #include "frontend.h"
  11. #include "func2.h"
  12. #include "func3.h"
  13. #include "sound.h"
  14. #include "network.h"
  15. #include "c:\netnow\hmistd.h"
  16. #include "c:\netnow\netnow.h"
  17. #include "gsscomms.h"
  18. #include "comms.h"
  19.  
  20. int    serial_port=2;
  21. int    modem_port=2;
  22. int    no_16550=0;                            //set to message number when no 16550 found!
  23. extern    unsigned char *scrbuf;
  24. extern    char    *front_vga[16];
  25. extern    int    head_x;
  26. extern    int    head_y;
  27. extern    volatile    int    game_type;
  28. extern    char    language_buffer[][64];
  29. extern    char    config_buffer[][64];
  30. extern    char    font1_ascii[256];
  31. extern    int    font1_offsets[];
  32. extern    unsigned char *screen;    /*pointer to screen */
  33. extern    volatile    int    frames;
  34. extern    unsigned char    keys[140];                        // entries get set to one when key is hit.
  35. extern    int    soundon,musicon;
  36. extern    int    MusicCD;
  37.  
  38.  
  39. typedef    struct    
  40.     {
  41.     char    name[51];
  42.     int    inittype;
  43.     }    modeminfo;
  44.  
  45.  
  46. typedef    struct
  47.     {
  48.     char    initstring[51];
  49.     }    initinfo;
  50.  
  51. modeminfo    *modembuffer;
  52. initinfo        *modembuffer2;
  53. int    current_modem=0;
  54. int    modems;
  55. int    modemstrs;
  56.  
  57.  
  58. int    select_comport(int type)
  59.     {
  60.     //serial link/modem select com port.
  61.     int    done=FALS;
  62.     int    key;
  63.     int    serials;
  64.  
  65. //    outp(0x20,0xc0+3-1);                //irq 3= COM 2, irq 4 = COM 1 !!!
  66.  
  67.  
  68.     serials=(_bios_equiplist()>>9) & 7;
  69.     if (serials<2) serials=2;                //force at least 2 serial ports!
  70.  
  71.     if (serials<serial_port) serial_port=2;
  72.     check16550(serial_port);
  73.  
  74.     while (!done)
  75.         {
  76.         display_picture(scrbuf,front_vga[0]);
  77.         display_block(scrbuf,front_vga[1],3,head_x,head_y,0);
  78.         display_block(scrbuf,front_vga[6],0,36,2,0);
  79.         display_block(scrbuf,front_vga[5],type,-4,247,0);
  80.         display_block(scrbuf,front_vga[5],game_type+5,135,247,0);
  81.         display_block(scrbuf,front_vga[4],4,76,257,-1);
  82.         display_block(scrbuf,front_vga[6],4,62,336,-1);
  83.  
  84.         scale_text(front_vga[15],&language_buffer[83][0],font1_ascii,font1_offsets,400,75,white,CENTRE_ALIGN,200,640);
  85.         scale_text(front_vga[15],&language_buffer[47][0],font1_ascii,font1_offsets,400,93,white,CENTRE_ALIGN,200,640);
  86.  
  87.  
  88.         scale_text(front_vga[15],"COM 1",font1_ascii,font1_offsets,400,135,serial_port==1?orange:white,CENTRE_ALIGN,200,640);
  89.         scale_text(front_vga[15],"COM 2",font1_ascii,font1_offsets,400,153,serial_port==2?orange:white,CENTRE_ALIGN,200,640);
  90.         if (serials>=3) scale_text(front_vga[15],"COM 3",font1_ascii,font1_offsets,400,171,serial_port==3?orange:white,CENTRE_ALIGN,200,640);
  91.         if (serials>=4) scale_text(front_vga[15],"COM 4",font1_ascii,font1_offsets,400,189,serial_port==4?orange:white,CENTRE_ALIGN,200,640);
  92.  
  93.         if (no_16550) 
  94.             scale_text(front_vga[15],language_buffer[109],font1_ascii,font1_offsets,400,351,red,CENTRE_ALIGN,200,640);
  95.  
  96.         copypic(scrbuf,screen);
  97.  
  98.         while (fatkbhit())
  99.             {
  100.             key=fatgetch();
  101.             switch (key)
  102.                 {
  103.                 case 0:
  104.                     key=fatgetch();
  105.                     switch (key)
  106.                         {
  107.                         case 80:    //down arrow
  108.                             if (serial_port!=serials) serial_port++;
  109.                             check16550(serial_port);
  110.                             break;
  111.                         case 72:    //up arrow
  112.                             if (serial_port!=1) serial_port--;
  113.                             check16550(serial_port);
  114.                             break;
  115.                         }
  116.                     break;
  117.                 case 13:
  118.                 case 27:
  119.                     done=TRU;
  120.                     break;
  121.                 }
  122.             }
  123.         }
  124.     gssCommsSetComPort(serial_port);
  125.     if (key==13)
  126.         return(TRU);
  127.     else
  128.         return(FALS);
  129.     }
  130.  
  131.  
  132. char    modem_initstring[51]="ATX";
  133. char    modem_phone[51]="";
  134. int    modem_tone=TRU;                        //T = tone, P = pulse
  135. int    modem_call=TRU;                    //default to calling!
  136.  
  137. int        stringwidth(volatile char *c)
  138.     {
  139.     int    w=0;
  140.     int    num;
  141.     int    * off;
  142.     w=0;
  143.     while (*c!=0)
  144.         {
  145.         num=font1_ascii[*c++];
  146.         if (num==255)
  147.             w+=8;
  148.         else
  149.             {
  150.             off=(int *) (front_vga[15]+num*12);
  151.             w+=off[0]+1;
  152.             }
  153.         }          
  154.     return(w);
  155.     }
  156.  
  157.  
  158.  
  159. int    select_modemstuff(int type)
  160.     {
  161.     int    x;
  162.     int    connecting_time=0;
  163.     int    message=-1;
  164.     int    mode=0;                                    //0 = normal, 1 = type in, 2 = dialling
  165. //    char    buffer[100];
  166.     int    done=FALS;
  167.     int    key;
  168.     int    serials;
  169.     int    option=5;
  170.     int    len;
  171.     float    wait_ok=0;
  172.     float wait_hangup=0;
  173.     char    * edstring;
  174.     int    modem_initialised=FALS;
  175.  
  176.     if (modem_call)
  177.         option=5;
  178.     else
  179.         option=6;
  180.  
  181.     loadmodemnames();
  182.     if (current_modem>=0)    strcpy(modem_initstring,modembuffer2[modembuffer[current_modem].inittype].initstring);
  183.  
  184.     serials=(_bios_equiplist()>>9) & 7;
  185.     if (modem_port<2) serials=2;                //force at least 2 serial ports!
  186.     if (serials<modem_port) modem_port=2;
  187.     check16550(modem_port);
  188.  
  189.     while (!done)
  190.         {
  191.         display_essentials(type,option,mode);
  192.  
  193.  
  194.         if (message==93 || message==94 || message==95 || message==96 || message==104)
  195.             {
  196.             if ((frames & 0x0f)<8)
  197.                 scale_text(front_vga[15],language_buffer[message],font1_ascii,font1_offsets,400,279,white,CENTRE_ALIGN,200,640);
  198.             }
  199.         else
  200.             if (message>=0)    scale_text(front_vga[15],language_buffer[message],font1_ascii,font1_offsets,400,279,red,CENTRE_ALIGN,200,640);
  201.  
  202.         copypic(scrbuf,screen);
  203.         
  204.         if (connecting_time!=0 && frames>connecting_time+72) done=TRU;
  205.         while (fatkbhit())
  206.             {
  207.             key=fatgetch();
  208.  
  209.             switch (mode)
  210.                 {
  211.                 case 0:
  212.                     //scrolling through!
  213.                     message=-1;
  214.                     switch (key)
  215.                         {
  216.                         case 0:
  217.                             key=fatgetch();
  218.                             switch (key)
  219.                                 {
  220.                                 case 80:    //down arrow
  221.                                     if (option<6)
  222.                                         {
  223.                                         option++;
  224.                                         }
  225.                                     break;
  226.                                 case 72:    //up arrow
  227.                                     if (option!=0)
  228.                                         {
  229.                                         option--;
  230.                                         }
  231.                                     break;
  232.                                 }
  233.                             break;
  234.                         case 13:
  235.                             switch(option)
  236.                                 {
  237.                                 case 0:
  238.                                     select_modem(type);
  239.                                     break;
  240.                                 case 1:
  241.                                     //change port
  242.                                     modem_port++;
  243.                                     if (modem_port>serials) modem_port=1;
  244.                                     check16550(modem_port);
  245.                                      break;
  246.                                 case 2:
  247.                                     // pulse/tone dialling
  248.                                     modem_tone=!modem_tone;
  249.                                     break;
  250.                                 case 3:
  251.                                     //init string
  252.                                     mode=1;
  253.                                     break;
  254.                                 case 4:
  255.                                     //telephone number
  256.                                     mode=1;
  257.                                     break;
  258.                                 case 5:
  259.                                 case 6:
  260.                                     if (option==5)
  261.                                         modem_call=TRU;
  262.                                     else
  263.                                         modem_call=FALS;
  264.                                     mode=2;
  265.                                     message=104;
  266.                                     scale_text(front_vga[15],language_buffer[message],font1_ascii,font1_offsets,400,279,white,CENTRE_ALIGN,200,640);
  267.                                     copypic(scrbuf,screen);
  268.  
  269.                                     gssCommsSetComPort(modem_port);
  270.                                     Initialise_Network();
  271.                                     gssModemHangUp();
  272.                                     wait_hangup=clock();
  273.                                     break;
  274.                                 }
  275.                             break;
  276.                         case 27:
  277.                             done=TRU;
  278.                             connecting_time=0;
  279.                             message=-1;
  280.                             wait_ok=0;                        //stop non-responding message coz escaped!
  281.                             wait_hangup=0;
  282.                             modem_initialised=FALS;
  283.                             break;
  284.                         }
  285.                     break;
  286.                 case 1:
  287.                     //user entry of a line
  288.                     if (option==3)
  289.                         edstring=modem_initstring;
  290.                     else
  291.                         edstring=modem_phone;
  292.     
  293.                     len=strlen(edstring);
  294.                     switch (key)
  295.                         {
  296.                         case 0:
  297.                             key=fatgetch();
  298.                             break;
  299.                         case 8:
  300.                              if (len>0)
  301.                                 {
  302.                                 edstring[len-1]=0;
  303.                                 if (option==3 && current_modem>=0)    current_modem=-current_modem-1;        //negative means custom set-up
  304.                                 }
  305.                             break;
  306.                         case 13:
  307.                         case 27:
  308.                             mode=0;
  309.                             connecting_time=0;
  310.                             message=-1;
  311.                             break;
  312.                         default:
  313.                             if (keys[0x2A] || keys[0x36])
  314.                                 {
  315.                                 #ifndef US_Wacky_Version
  316.                                     switch(key)
  317.                                         {
  318.                                         case '1':
  319.                                             key='!';
  320.                                             break;
  321.                                         case '2':
  322.                                             key='\"';
  323.                                             break;
  324.                                         case '3':
  325.                                             key='รบ';
  326.                                             break;
  327.                                         case '4':
  328.                                             key='$';
  329.                                             break;
  330.                                         case '5':
  331.                                             key='%';
  332.                                             break;
  333.                                         case '6':
  334.                                             key='^';
  335.                                             break;
  336.                                         case '7':
  337.                                             key='&';
  338.                                             break;
  339.                                         case '8':
  340.                                             key='*';
  341.                                             break;
  342.                                         case '9':
  343.                                             key='(';
  344.                                             break;
  345.                                         case '0':
  346.                                             key=')';
  347.                                             break;
  348.                                         case '-':
  349.                                             key='_';
  350.                                             break;
  351.                                         case '=':
  352.                                             key='+';
  353.                                             break;
  354.                                         case ';':
  355.                                             key=':';
  356.                                             break;
  357.                                         case '\'':
  358.                                             key='@';
  359.                                             break;
  360.                                         case '#':
  361.                                             key='~';
  362.                                             break;
  363.                                         case ',':
  364.                                             key='<';
  365.                                             break;
  366.                                         case '.':
  367.                                             key='>';
  368.                                             break;
  369.                                         case '/':
  370.                                             key='?';
  371.                                             break;
  372.                                         }
  373.                                 #else
  374.                                     switch(key)
  375.                                         {
  376.                                         case '1':
  377.                                             key='!';
  378.                                             break;
  379.                                         case '2':
  380.                                             key='@';
  381.                                             break;
  382.                                         case '3':
  383.                                             key='#';
  384.                                             break;
  385.                                         case '4':
  386.                                             key='$';
  387.                                             break;
  388.                                         case '5':
  389.                                             key='%';
  390.                                             break;
  391.                                         case '6':
  392.                                             key='^';
  393.                                             break;
  394.                                         case '7':
  395.                                             key='&';
  396.                                             break;
  397.                                         case '8':
  398.                                             key='*';
  399.                                             break;
  400.                                         case '9':
  401.                                             key='(';
  402.                                                 break;
  403.                                         case '0':
  404.                                             key=')';
  405.                                             break;
  406.                                         case '-':
  407.                                             key='_';
  408.                                             break;
  409.                                         case '=':
  410.                                             key='+';
  411.                                             break;
  412.                                         case ';':
  413.                                             key=':';
  414.                                             break;
  415.                                         case '\'':
  416.                                             key='\"';
  417.                                             break;
  418.                                         case '#':
  419.                                             key='|';
  420.                                             break;
  421.                                         case '`':
  422.                                             key='~';
  423.                                             break;
  424.                                         case ',':
  425.                                             key='<';
  426.                                             break;
  427.                                         case '.':
  428.                                             key='>';
  429.                                             break;
  430.                                         case '/':
  431.                                             key='?';
  432.                                             break;
  433.                                         }
  434.                                 #endif
  435.                                 }
  436.  
  437.                             if (strlen(edstring)<50 && key!=127)
  438.                                 {
  439.                                 edstring[len]=key;
  440.                                 edstring[len+1]=0;
  441.                                 if (option==3 && current_modem>=0)    current_modem=-current_modem-1;        //negative means custom set-up
  442.                                 }
  443.                             break;
  444.                         }
  445.                     break;
  446.                 case 2:
  447.                     //dial/receive mode!
  448.                     switch(key)
  449.                         {
  450.                         case 0:
  451.                             key=fatgetch();
  452.                             break;
  453.                         case 27:
  454.                             mode=0;                        //jump back to mode 0!
  455.                             message=-1;
  456.                             connecting_time=0;
  457.                             wait_ok=0;                    //stop non-responding message!
  458.                             wait_hangup=0;
  459.                             modem_initialised=FALS;
  460.                             display_essentials(type,option,mode);
  461.                             scale_text(front_vga[15],&language_buffer[108][0],font1_ascii,                //RESETTING MODEM
  462.                                 font1_offsets,400,279,white,CENTRE_ALIGN,200,640);
  463.                             copypic(scrbuf,screen);
  464.                             close_network();
  465.                             break;
  466. //                        case 32:
  467. //                            connecting_time=frames;
  468. //                            message=95;
  469. //                            break;
  470.                         }
  471.                     break;
  472.                 }
  473.             }
  474.  
  475.         if (mode==2 && connecting_time==0)
  476.             {
  477.             //keep scanning for responses!
  478.             x=gssModemCheckResponse();
  479.             if (x>=0)
  480.                 {
  481.                 //modem sent a response!
  482.                 switch (x)
  483.                     {
  484. //                    case 0:
  485.                     case    gssOK:
  486.                         //OK to some command!
  487.                         if (wait_ok!=0)
  488.                             {
  489.                             // ok from modem - dial as necessary
  490.                             if (modem_call)    gssModemDial(modem_phone,modem_tone);
  491.                             wait_ok=0;
  492.                             if (modem_call)
  493.                                 message=94;
  494.                             else
  495.                                 message=93;
  496.                             modem_initialised=TRU;
  497.                             }
  498.                         if (wait_hangup!=0)
  499.                             {
  500.                             //ok from modem when waiting for hangup.
  501.                             wait_hangup=0;
  502.                             gssModemInit(modem_initstring);
  503.                              wait_ok=clock();                            //wait for OK from modem - time out if not there
  504.                             }
  505.  
  506.                         break;
  507. //                    case 1:
  508.                     case gssCONNECT:
  509.                         //connect!
  510.                         message=95;
  511.                         connecting_time=frames;
  512.                         break;
  513. //                    case 2:
  514.                     case gssRING:
  515.                         //phone is ringing - only answer if ok read first? will this work?
  516.                         if (modem_initialised && !modem_call)
  517.                             {
  518.                             gssModemAnswer();
  519.                             message=96;
  520.                             }
  521.                         break;
  522. //                    case 3:                        
  523. //                    case 4:
  524. //                    case 5:
  525. //                    case 6:
  526. //                    case 7:
  527.                     case gssNOCARRIER:
  528.                     case gssERROR:
  529.                     case gssNODIALTONE:
  530.                     case gssBUSY:
  531.                     case gssNOANSWER:
  532.                         message=x+94;                    //set error message up
  533.                         close_network();
  534.                         mode=0;
  535.                         break;
  536.                     }
  537.                 }
  538.             }
  539.         if (wait_ok!=0 && (clock()-wait_ok)/CLOCKS_PER_SEC>5)
  540.             {
  541.             message=105;                            //modem is not responding!
  542.             close_network();
  543.             wait_ok=0;
  544.             wait_hangup=0;
  545.             modem_initialised=FALS;
  546.             mode=0;
  547.             }
  548.         if (wait_hangup!=0 && (clock()-wait_hangup)/CLOCKS_PER_SEC>5)
  549.             {
  550.             message=105;                            //modem is not responding!
  551.             close_network();
  552.             wait_ok=0;
  553.             wait_hangup=0;
  554.             modem_initialised=FALS;
  555.             mode=0;
  556.             }
  557.  
  558.  
  559.         }
  560.     fre((char **) &modembuffer);
  561.     fre((char **) &modembuffer2);
  562.     if (connecting_time)
  563.         {
  564.         return(TRU);
  565.         }
  566.     else
  567.         {
  568.         gssModemHangUp();
  569.         close_network();
  570.         return(FALS);
  571.         }
  572.     }
  573.  
  574. void    loadmodemnames()
  575.     {
  576.     FILE    *fp=NULL;
  577.     char    buffer[512];
  578.     char    *    delims={" ,\n\t\r"};
  579.     char    *p;
  580.     int    i;
  581.  
  582.     fp=fopen("MODEM.INI","r");
  583.     fgets(buffer,512,fp);
  584.     p=strtok(buffer,delims);
  585.  
  586.     modems=strtol(p,NULL,10);
  587.  
  588.     modembuffer=(modeminfo *) getbuffer(sizeof(modeminfo)*modems);
  589.     if (modembuffer==NULL) modems=0;                                //can't load modem names!
  590.  
  591.     for (i=0;i<modems;i++)
  592.         {
  593.         fgets(buffer,512,fp);
  594.         p=strtok(buffer," ");
  595.         modembuffer[i].inittype=strtol(p,NULL,10)-1;
  596.         p=strtok(NULL,"\r\n");
  597.         strcpy(modembuffer[i].name,p);
  598.         }
  599.     fclose(fp);
  600.  
  601.  
  602.  
  603.  
  604.     fp=fopen("MODEMSTR.INI","r");
  605.     fgets(buffer,512,fp);
  606.     p=strtok(buffer,delims);
  607.  
  608.     modemstrs=strtol(p,NULL,10);
  609.  
  610.     modembuffer2=(initinfo *) getbuffer(sizeof(initinfo)*modemstrs);
  611.     if (modembuffer2==NULL) modemstrs=0;                                //can't load modem names!
  612.  
  613.     for (i=0;i<modemstrs;i++)
  614.         {
  615.         fgets(buffer,512,fp);
  616.         p=strtok(buffer,"\r\n\t");
  617.         strcpy(modembuffer2[i].initstring,p);
  618.         }
  619.     fclose(fp);
  620.  
  621.     if (current_modem>=modems)    current_modem=modems-1;
  622.     if (current_modem<-modems)    current_modem=-modems;
  623.  
  624.     }
  625.  
  626. void    select_modem(int type)
  627.     {
  628.     int    done=FALS;
  629.     int    new_modem=current_modem;
  630.     int    first,last,i;
  631.     int    key;
  632.  
  633.     if (new_modem<0) new_modem=-new_modem-1;            //covert custom set up to the first modem!
  634.     while (!done)
  635.         {
  636.         display_picture(scrbuf,front_vga[0]);
  637.         display_block(scrbuf,front_vga[1],3,head_x,head_y,0);
  638.         display_block(scrbuf,front_vga[6],0,36,2,0);
  639.         display_block(scrbuf,front_vga[5],type,-4,247,0);
  640.         display_block(scrbuf,front_vga[5],game_type+5,135,247,0);
  641.         display_block(scrbuf,front_vga[4],4,76,257,-1);
  642.         display_block(scrbuf,front_vga[6],4,62,336,-1);
  643.  
  644.         scale_text(front_vga[15],language_buffer[106],font1_ascii,font1_offsets,400,75,white,CENTRE_ALIGN,200,640);
  645.  
  646.         first=new_modem-7;
  647.         if (first<0) first=0;
  648.         last=new_modem+7;
  649.         if (last>=modems) last=modems-1;
  650.  
  651.  
  652.         for (i=first;i<=last;i++)
  653.             {
  654.             scale_text(front_vga[15],modembuffer[i].name,font1_ascii,font1_offsets,400,237-(new_modem-i)*18,
  655.                     i==new_modem?orange:white,CENTRE_ALIGN,200,640);
  656.             }
  657.         copypic(scrbuf,screen);
  658.  
  659.  
  660.         while (fatkbhit())
  661.             {
  662.             key=fatgetch();
  663.  
  664.             switch (key)
  665.                 {
  666.                 case 0:
  667.                     key=fatgetch();
  668.                     switch (key)
  669.                         {
  670.                         case 80:    //down arrow
  671.                             if (new_modem<modems-1)
  672.                                 new_modem++;
  673.                             break;
  674.                         case 72:    //up arrow
  675.                             if (new_modem!=0) new_modem--;
  676.                             break;
  677.                         case 71:    //home
  678.                             new_modem=0;
  679.                             break;
  680.                         case 79:    //end
  681.                             new_modem=modems-1;
  682.                             break;
  683.                         case 73:
  684.                             new_modem-=15;
  685.                             if (new_modem<0) new_modem=0;
  686.                             break;
  687.                         case 81:
  688.                             new_modem+=15;
  689.                             if (new_modem>modems-1) new_modem=modems-1;
  690.                             break;
  691.                         }
  692.                     break;
  693.                 case 13:
  694.                     current_modem=new_modem;
  695.                     strcpy(modem_initstring,modembuffer2[modembuffer[current_modem].inittype].initstring);
  696.                     done=TRU;
  697.                     break;
  698.                 case 27:
  699.                     done=TRU;
  700.                     break;
  701.                 }
  702.             }
  703.         }
  704.     }
  705.  
  706.  
  707. char    * getprintstring(char * string,int    input)
  708.     {
  709.     //given the required string, returns a string with ... added if it doesn't fit in the display.
  710.     int    len;
  711.     static    char    getresult[100];
  712.  
  713.     strcpy(getresult,string);
  714.     if (!input)
  715.         {
  716.         if (stringwidth(string)>240)
  717.             {
  718.             len=strlen(getresult);
  719.             do
  720.                 {
  721.                 getresult[len-1]='.';
  722.                 getresult[len]='.';
  723.                 getresult[len+1]='.';
  724.                 getresult[len+2]=0;
  725.                 len--;
  726.                  }
  727.             while (stringwidth(getresult)>240);
  728.             }
  729.         }
  730.     else
  731.         {
  732.         len=strlen(getresult);
  733.         getresult[len]='_';
  734.         getresult[len+1]=0;
  735.         if (stringwidth(getresult)>240)
  736.             {
  737.             //doesn't fit - prefix with ...
  738.             getresult[0]='.';
  739.             getresult[1]='.';
  740.             getresult[2]='.';
  741.             strcpy(getresult+3,string);
  742.             getresult[len+3]='_';
  743.             getresult[len+4]=0;
  744.             len++;                                                        //length of string + underline!
  745.             while(stringwidth(getresult)>240)
  746.                 {
  747.                 memmove(getresult+3,getresult+4,len);
  748.                 len--;
  749.                 }
  750.             len+=3;                                                        //length including ... prefix
  751.             }
  752.         else
  753.             len++;                                                        //length including cursor!
  754.         if ((frames &0xf)>=8) getresult[len-1]=0;                //no cursor!
  755.     
  756.  
  757.         }
  758.     return(getresult);
  759.     }
  760.  
  761.  
  762. void    display_essentials(int type,int option,int mode)
  763.     {
  764.     char    buffer[100];
  765.  
  766.     display_picture(scrbuf,front_vga[0]);
  767.     display_block(scrbuf,front_vga[1],3,head_x,head_y,0);
  768.     display_block(scrbuf,front_vga[6],0,36,2,0);
  769.     display_block(scrbuf,front_vga[5],type,-4,247,0);
  770.     display_block(scrbuf,front_vga[5],game_type+5,135,247,0);
  771.     display_block(scrbuf,front_vga[4],4,76,257,-1);
  772.     display_block(scrbuf,front_vga[6],4,62,336,-1);
  773.  
  774.     scale_text(front_vga[15],language_buffer[84],font1_ascii,font1_offsets,400,75,white,CENTRE_ALIGN,200,640);
  775.  
  776.     //name
  777.     if (modembuffer!=NULL)
  778.         {
  779.         if (current_modem>=0)
  780.             scale_text(front_vga[15],modembuffer[current_modem].name,font1_ascii,font1_offsets,400,117,option==0?orange:white,CENTRE_ALIGN,200,640);
  781.         else
  782.             scale_text(front_vga[15],language_buffer[107],font1_ascii,font1_offsets,400,117,option==0?orange:white,CENTRE_ALIGN,200,640);    //custom
  783.         }
  784.  
  785.  
  786.     //Port
  787.     sprintf(buffer,"COM %d",modem_port);
  788.     scale_text(front_vga[15],language_buffer[85],font1_ascii,font1_offsets,400,135,option==1?orange:white,RIGHT_ALIGN,200,640);
  789.     scale_text(front_vga[15],buffer,font1_ascii,font1_offsets,400,135,option==1?orange:white,LEFT_ALIGN,200,640);
  790.  
  791.     //Dial
  792.     scale_text(front_vga[15],language_buffer[86],font1_ascii,font1_offsets,400,153,option==2?orange:white,RIGHT_ALIGN,200,640);
  793.     if (modem_tone)
  794.         scale_text(front_vga[15],language_buffer[87],font1_ascii,font1_offsets,400,153,option==2?orange:white,LEFT_ALIGN,200,640);
  795.     else
  796.         scale_text(front_vga[15],language_buffer[88],font1_ascii,font1_offsets,400,153,option==2?orange:white,LEFT_ALIGN,200,640);
  797.  
  798.     //Init string
  799.     scale_text(front_vga[15],language_buffer[89],font1_ascii,font1_offsets,400,171,option==3?orange:white,RIGHT_ALIGN,200,640);
  800.     scale_text(front_vga[15],getprintstring(modem_initstring,option==3 && mode==1),
  801.                 font1_ascii,font1_offsets,400,171,option==3?orange:white,LEFT_ALIGN,200,640);
  802.  
  803.     //phone
  804.     scale_text(front_vga[15],language_buffer[90],font1_ascii,font1_offsets,400,189,option==4?orange:white,RIGHT_ALIGN,200,640);
  805.     scale_text(front_vga[15],getprintstring(modem_phone,option==4 && mode==1),
  806.                 font1_ascii,font1_offsets,400,189,option==4?orange:white,LEFT_ALIGN,200,640);
  807.  
  808.     //call/answer
  809.  
  810.     scale_text(front_vga[15],language_buffer[91],font1_ascii,font1_offsets,400,225,option==5?orange:white,CENTRE_ALIGN,200,640);
  811.     scale_text(front_vga[15],language_buffer[92],font1_ascii,font1_offsets,400,243,option==6?orange:white,CENTRE_ALIGN,200,640);
  812.  
  813.     if (no_16550)    scale_text(front_vga[15],language_buffer[no_16550],font1_ascii,font1_offsets,400,351,red,CENTRE_ALIGN,200,640);
  814.  
  815.     }
  816.  
  817.  
  818. void    check16550(int port)
  819.     {
  820.     if (!gss16550(port))
  821.         {
  822.         //turn off the sounds here!
  823.         if (!MusicCD)
  824.             no_16550=109;                //sound/music
  825.         else
  826.             no_16550=110;                //sound only
  827.         }
  828.     else
  829.         no_16550=0;
  830.  
  831.     if (no_16550==109)
  832.         {
  833.         musicon=FALS;
  834.         reinitmusic();
  835.         }
  836.     if (no_16550)
  837.         {
  838.         soundon=FALS;
  839.         }
  840.     }
  841.